import auth from "@/plugins/auth";
import router, { constantRoutes, dynamicRoutes } from "@/router";
import { getRouters } from "@/api/menu";
import Layout from "@/layout/index";
import ParentView from "@/components/ParentView";
import InnerLink from "@/layout/components/InnerLink";

// 匹配views里面所有的.vue文件
const modules = import.meta.glob("./../../views/**/*.vue");

const usePermissionStore = defineStore("permission", {
  state: () => ({
    routes: [],
    addRoutes: [],
    defaultRoutes: [],
    topbarRouters: [],
    sidebarRouters: [],
  }),
  actions: {
    setRoutes(routes) {
      this.addRoutes = routes;
      this.routes = constantRoutes.concat(routes);
    },
    setDefaultRoutes(routes) {
      this.defaultRoutes = constantRoutes.concat(routes);
    },
    setTopbarRoutes(routes) {
      this.topbarRouters = routes;
    },
    setSidebarRouters(routes) {
      this.sidebarRouters = routes;
    },
    generateRoutes(dataD) {
      return new Promise((resolve) => {
        // 向后端请求路由数据
        getRouters(dataD).then((res) => {
          console.log(res, "则会使q");
          res = {
            msg: "操作成功",
            code: 200,
            data: [
              {
                name: "System",
                path: "/system",
                hidden: false,
                redirect: "noRedirect",
                component: "Layout",
                alwaysShow: true,
                permissions: ["sys:admin"],
                meta: {
                  title: "系统管理",
                  icon: "system",
                  noCache: false,
                  link: null,
                },
                children: [
                  {
                    name: "Role",
                    path: "role",
                    hidden: false,
                    component: "system/role/index",
                    permissions: ["sys:role"],
                    meta: {
                      title: "角色管理",
                      icon: "peoples",
                      noCache: false,
                      link: null,
                    },
                  },
                  {
                    name: "User",
                    path: "user",
                    hidden: false,
                    component: "system/user/index",
                    permissions: ["sys:account"],
                    meta: {
                      title: "用户管理",
                      icon: "user",
                      noCache: false,
                      link: null,
                    },
                  },
                ],
              },
              {
                name: "Tool",
                path: "/tool",
                hidden: false,
                redirect: "noRedirect",
                component: "Layout",
                alwaysShow: true,
                permissions: ["sys:order"],
                meta: {
                  title: "订单管理",
                  icon: "list",
                  noCache: false,
                  link: null,
                },
                children: [
                  {
                    name: "Build",
                    path: "build",
                    hidden: false,
                    component: "tool/build/index",
                    permissions: ["sys:porder"],
                    meta: {
                      title: "普通订单",
                      icon: "build",
                      noCache: false,
                      showFather: true,
                      link: null,
                    },
                  },

                  {
                    name: "Swagger",
                    path: "swagger",
                    hidden: false,
                    component: "tool/build/index",
                    permissions: ["sys:torder"],
                    meta: {
                      title: "兑换订单",
                      icon: "swagger",
                      noCache: false,
                      link: null,
                    },
                  },
                ],
              },
              {
                name: "Director",
                path: "/director",
                hidden: false,
                component: "Layout",
                redirect: "noRedirect",
                alwaysShow: true,
                permissions: ["sys:area"],
                meta: {
                  title: "区域管理",
                  icon: "guide",
                  noCache: false,
                  link: null,
                },
                children: [
                  {
                    name: "Attach",
                    path: "attach",
                    hidden: false,
                    component: "director/index",
                    permissions: ["sys:delivery"],
                    meta: {
                      title: "区域分配",
                      icon: "van",
                      noCache: false,
                      showFather: true,
                      link: null,
                    },
                  },
                ],
              },
              {
                name: "CommodityMgt",
                path: "/commodityMgt",
                hidden: false,
                component: "Layout",
                redirect: "noRedirect",
                alwaysShow: true,
                permissions: ["product:mamager"],
                meta: {
                  title: "商品管理",
                  icon: "GoodsFilled",
                  noCache: false,
                  link: null,
                },
                children: [
                  {
                    name: "CommodityHome",
                    path: "commodityHome",
                    hidden: false,
                    component: "commodityMgt/commodityHome/commodity",
                    permissions: ["product:order"],
                    meta: {
                      title: "首页商品排序",
                      icon: "Goods",
                      noCache: false,
                      showFather: true,
                      link: null,
                    },
                  },
                  {
                    name: "ImageAdmin",
                    path: "imageAdmin",
                    hidden: false,
                    component: "commodityMgt/imageAdmin/imageAdmin",
                    permissions: ["product:pic"],
                    meta: {
                      title: "图片管理",
                      icon: "imageAdmin",
                      noCache: false,
                      showFather: true,
                      link: null,
                    },
                  },
                ],
              },
            ],
          };

          const sdata = JSON.parse(JSON.stringify(res.data));
          const rdata = JSON.parse(JSON.stringify(res.data));
          const defaultData = JSON.parse(JSON.stringify(res.data));
          const sidebarRoutes = filterAsyncRouter(sdata);
          const rewriteRoutes = filterAsyncRouter(rdata, false, true);
          const defaultRoutes = filterAsyncRouter(defaultData);
          // const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
          const asyncRoutes = filterDynamicRoutes(defaultData);
          asyncRoutes.forEach((route) => {
            router.addRoute(route);
          });
          // this.setRoutes(rewriteRoutes);
          this.setRoutes(asyncRoutes);
          this.setSidebarRouters(constantRoutes.concat(asyncRoutes));
          // this.setSidebarRouters(dynamicRoutes.concat(asyncRoutes));
          // this.setDefaultRoutes(sidebarRoutes);
          // this.setTopbarRoutes(defaultRoutes);
          // resolve(rewriteRoutes);
          this.setDefaultRoutes(asyncRoutes);
          this.setTopbarRoutes(asyncRoutes);
          resolve(asyncRoutes);
        });
      });
    },
  },
});

// 遍历后台传来的路由字符串，转换为组件对象
function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
  return asyncRouterMap.filter((route) => {
    if (type && route.children) {
      route.children = filterChildren(route.children);
    }
    if (route.component) {
      // Layout ParentView 组件特殊处理
      if (route.component === "Layout") {
        route.component = Layout;
      } else if (route.component === "ParentView") {
        route.component = ParentView;
      } else if (route.component === "InnerLink") {
        route.component = InnerLink;
      } else {
        route.component = loadView(route.component);
      }
    }
    if (route.children != null && route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children, route, type);
    } else {
      delete route["children"];
      delete route["redirect"];
    }
    return true;
  });
}

function filterChildren(childrenMap, lastRouter = false) {
  var children = [];
  childrenMap.forEach((el, index) => {
    if (el.children && el.children.length) {
      if (el.component === "ParentView" && !lastRouter) {
        el.children.forEach((c) => {
          c.path = el.path + "/" + c.path;
          if (c.children && c.children.length) {
            children = children.concat(filterChildren(c.children, c));
            return;
          }
          children.push(c);
        });
        return;
      }
    }
    if (lastRouter) {
      el.path = lastRouter.path + "/" + el.path;
    }
    children = children.concat(el);
  });
  return children;
}

// 动态路由遍历，验证是否具备权限
export function filterDynamicRoutes(routes) {
  const res = [];
  routes.forEach((route) => {
    if (route.permissions) {
      if (auth.hasPermiOr(route.permissions)) {
        res.push(route);
      }
    } else if (route.roles) {
      if (auth.hasRoleOr(route.roles)) {
        res.push(route);
      }
    }
    if (route.children && route.children.length) {
      route.children = filterDynamicRoutes(route.children);
    }
  });
  return res;
}

export const loadView = (view) => {
  let res;
  for (const path in modules) {
    const dir = path.split("views/")[1].split(".vue")[0];
    if (dir === view) {
      res = () => modules[path]();
    }
  }
  return res;
};

export default usePermissionStore;
